//***************************************************************************************

//                              实现模板匹配-0代表平方差匹配法
//  1代表归一化平方差匹配法，2代表相关匹配法，3代表归一化相关匹配法，4代表系数匹配法，5代表归一化系数匹配法
//                              本例子使用的方法5

//***************************************************************************************

#include "ImageDecMat.hpp"

void ImageDecMat::on_matchTemplate(cv::Mat Image1,cv::Mat Image2,cv::Mat& Image3)
{
    int matchMethod=5;//0代表平方差匹配法，1代表归一化平方差匹配法，2代表相关匹配法，3代表归一化相关匹配法，4代表系数匹配法，5代表归一化系数匹配法
    //用于结果输出的矩阵
    cv::Mat dstImage;
    int dstImage_rows=Image1.rows-Image2.rows+1;
    int dstImage_cols=Image1.cols-Image2.cols+1;
    dstImage.create(dstImage_rows,dstImage_cols, CV_32FC1);
    //进行匹配和归一化
    cv::matchTemplate(Image1, Image2,dstImage, matchMethod);
    normalize(dstImage,dstImage,0,1,cv::NORM_MINMAX,-1,cv::Mat());
    //通过函数minMaxLoc定位最匹配的位置
    double minVal,maxVal;
    cv::Point minLoc,maxLoc,matchLoc;
    minMaxLoc(dstImage, &minVal,&maxVal,&minLoc,&maxLoc,cv::Mat());
    
    //对于平方差匹配方法和归一化平方差匹配方法，越小的值有更高的匹配结果，而其余的方法相反。
    if(matchMethod==cv::TM_SQDIFF||matchMethod==cv::TM_SQDIFF_NORMED)
    {
        matchLoc=minLoc;
    }
    else
    {
        matchLoc=maxLoc;
    }
    //绘制矩形，并显示最终结果
    rectangle(Image1, matchLoc, cvPoint(matchLoc.x+ Image2.cols,matchLoc.y+ Image2.rows), cvScalar(0,0,255),2,8,0);
    Image1.copyTo(Image3);
}
